package DAO;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.hibernate.HibernateException;

import ClassesBasicas.Pessoa;
import Excecao.PessoaInexistenteException;

public class RepositorioPessoa extends RepositorioBasico {
		
	public RepositorioPessoa(){
		super();
	}
	
	public void atualizar(Pessoa pessoa, String tipo) throws PessoaInexistenteException{
		try{
			abreSessao();
			session.update(pessoa);
			fechaSessao();
		}catch(HibernateException e){
			tx.rollback();
		}
	}
	
	public void inserir(Pessoa pessoa){
		try{
			abreSessao();
			session.save(pessoa);
			fechaSessao();
		}catch(HibernateException ex){
			tx.rollback();			
		}
	}
	
	public void remover(String cpf, String tipo) throws PessoaInexistenteException{
		try{
			abreSessao();
			Pessoa pessoa = this.procurar(cpf, tipo);	
			session.delete(pessoa);
			fechaSessao();
		}catch(HibernateException ex){			
			tx.rollback();			
		}
	}
	
	@SuppressWarnings("unchecked")
	public Pessoa procurar(String cpf, String tipo) throws PessoaInexistenteException{
		Pessoa retorno = null;
		abreSessao();
		List<Pessoa> pessoas = new ArrayList<Pessoa>();
		org.hibernate.Query q = session.createQuery("from "+tipo);
		pessoas = q.list();
		for(Pessoa p: pessoas)
		{
			if(p.getCpf().equals(cpf)){
				retorno = p;
			}
		}
		fechaSessao();
		return retorno;		
	}
	
	public boolean existe(String cpf, String tipo){
		boolean existe = false;
		try {
			if(this.procurar(cpf, tipo) != null){
				existe = true;
			}
		} catch (PessoaInexistenteException e) {
			e.printStackTrace();
		}
		return existe;
	}

	@SuppressWarnings("unchecked")
	public Collection<? extends Pessoa> listar(String tipo){
		abreSessao();
		List<Pessoa> retorno = new ArrayList<Pessoa>();
		org.hibernate.Query q = session.createQuery("from "+tipo);
		List<Pessoa> pessoas = q.list();
		for(Pessoa p: pessoas){
			retorno.add(p);
		}
		fechaSessao();
		return retorno;		
	}
	
	
	@SuppressWarnings("unchecked")
	public Pessoa procurarPessoaNome(String nome)throws PessoaInexistenteException{
		abreSessao();
		List<Pessoa> pessoas = new ArrayList<Pessoa>();
		org.hibernate.Query q = session.createQuery("from Pessoa");
		pessoas = q.list();
		for(Pessoa pessoa: pessoas)
		{
			if(pessoa.getNome().equals(nome)){
				return pessoa;
			}
		}
		fechaSessao();
		return null;
	}
	
	
	
	
}
